/*
 ALAN GONZALEZ
 ESTE MODULO ES AUXILIAR AL MODULO TARRY SYSTEM
 */
package Servlets;

import Estructuras.Principales.ClientesPrincipalDTO;
import Estructuras.Principales.TarryPrincipal;
import TarryDAOS.ClientesDAO;
import TarryDAOS.ProductosVentaDAO;
import TarryDTOS.ClientesDTO;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author MauricioAlanGonzalez
 */
@WebServlet(name = "Clientes", urlPatterns = {"/Clientes"})
public class Clientes extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            String action = request.getParameter("action");
            HttpSession session = request.getSession();

// TERMINAL TPV
            if (action.equals("filtrarCliente")) {
                this.filtrarCliente(request, response, session);
            } else if (action.equals("cargaCliente")) {
                this.cargaCliente(request, response, session);
            } else if (action.equals("productosFiltro")) {
                this.productosFiltro(request, response, session);
            } else if (action.equals("cargaProducto")) {
                this.cargaProducto(request, response, session);

            } else if (action.equals("clientesAdmin")) {
                this.clientesAdmin(request, response, session);
            } else if (action.equals("nuevoCliente")) {
                this.nuevoCliente(request, response, session);
            } else if (action.equals("editaCliente")) {
                this.editaCliente(request, response, session);
            } else if (action.equals("clienteRequest")) {
                this.clienteRequest(request, response, session);
            } else if (action.equals("nombreClienteFiltro")) {
                this.nombreClienteFiltro(request, response, session);

            } else {
                System.out.println("NO EXISTE SERVICIO");
            }
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /**
     * ALAN GONZALEZ SERVICIO PARA FILTRAR CLIENTES
     *
     * @param request
     * @param response
     * @param session
     */
    public void filtrarCliente(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TarryPrincipal principal = (TarryPrincipal) session.getAttribute("tarryPrincipal");
        String nombreCliente = request.getParameter("nombreCliente");
        ClientesDAO clientesDAO = new ClientesDAO();
        Vector vClientes = new Vector();
        vClientes = clientesDAO.todosClientesNombre(nombreCliente);
        principal.setClientes(vClientes);
        session.removeAttribute("tarryPrincipal");
        session.setAttribute("tarryPrincipal", principal);
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/nuevoPedido.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(TarryTPV.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TarryTPV.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO PARA CARGAR LA INTERFAZ LISTA PARA TERMINAR EL
     * REGISTRO SERV
     *
     * @param request
     * @param response
     * @param session
     */
    public void cargaCliente(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TarryPrincipal principal = (TarryPrincipal) session.getAttribute("tarryPrincipal");
        int idCliente = Integer.parseInt(request.getParameter("idCliente"));
        principal.setIdClienteApuntador(idCliente);
        session.setAttribute("tarryPrincipal", principal);
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/nuevoPedido.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(TarryTPV.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TarryTPV.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO PARA FILTRAR EL CATALOGO DE PRODUCTOS
     *
     * @param request
     * @param response
     * @param session
     */
    public void productosFiltro(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TarryPrincipal principal = (TarryPrincipal) session.getAttribute("tarryPrincipal");
        String indicio = new String();
        int claveProducto = 0;
        Vector errores = new Vector();
        if (request.getParameter("indicio").length() > 0 && request.getParameter("claveProducto").length() == 0) {
            indicio = request.getParameter("indicio");
        } else if (request.getParameter("indicio").length() == 0 && request.getParameter("claveProducto").length() > 0) {
            claveProducto = Integer.parseInt(request.getParameter("claveProducto"));

        } else if (request.getParameter("indicio").length() == 0 && request.getParameter("claveProducto").length() == 0) {
            errores.add("SE REQUIERE AL MENOS UN PARAMETRO PARA REALIZAR EL FILTRO");
            principal.setErroresFiltro(errores);
            principal.setnErroresFiltro(errores.size());
            session.setAttribute("tarryPrincipal", principal);
            RequestDispatcher d = request.getRequestDispatcher("TarryJSP/nuevoItem.jsp");
            try {
                d.forward(request, response);
            } catch (ServletException ex) {
                Logger.getLogger(TarryTPV.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(TarryTPV.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        ProductosVentaDAO productosVenta = new ProductosVentaDAO();
        Vector vProductos = new Vector();
        vProductos = productosVenta.todoProductoConInidicio(indicio);
        principal.setProductos(vProductos);
        session.setAttribute("tarryPrincipal", principal);

        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/nuevoItem.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(TarryTPV.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TarryTPV.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    /**
     * ALAN GONZALEZ SERVICIO PARA CARGAR EL ID DEL PRODUCTO Y SU PRECIO
     *
     * @param request
     * @param response
     * @param session
     */
    public void cargaProducto(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        TarryPrincipal principal = (TarryPrincipal) session.getAttribute("tarryPrincipal");
        int idProducto = Integer.parseInt(request.getParameter("idProducto"));
        ProductosVentaDAO productosVenta = new ProductosVentaDAO();
        double precioListaProducto = productosVenta.precioListaProdcuto(idProducto);

        principal.setIdProductoApuntador(idProducto);
        principal.setPrecioListaApuntador(precioListaProducto);

        session.setAttribute("tarryPrincipal", principal);

        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/nuevoItem.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(TarryTPV.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(TarryTPV.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ | MODULO DE CLIENTES > > MUESTRA TODOS LOS CLIENTES
     *
     * @param request
     * @param response
     * @param session
     */
    public void clientesAdmin(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        ClientesPrincipalDTO clientesPrincipal = new ClientesPrincipalDTO();
        ClientesDAO clientesDAO = new ClientesDAO();
        Vector vClientes = new Vector();
        vClientes = clientesDAO.todosClientes();
        clientesPrincipal.setClientes(vClientes);
        session.setAttribute("clientesPrincipal", clientesPrincipal);
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/ClientesJSP/ClientesAdmin.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ | SERVICIO QUE MUESTRA INTREFAZ JSP PARA REGISTRO NUEVO
     *
     * @param request
     * @param response
     * @param session
     */
    public void nuevoCliente(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        ClientesPrincipalDTO clientesPrincipal = new ClientesPrincipalDTO();
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/ClientesJSP/editorCliente.jsp");
        clientesPrincipal.setFormularioDireccionApuntador("./Clientes?action=clienteRequest&flag=0&idReg=0");
        session.setAttribute("clientesPrincipal", clientesPrincipal);
        //clienteRequest
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ | SERVICIO QUE MUESTRA LA INTERFAZ DE EDICION DE CLIENTES |
     *
     * @param request
     * @param response
     * @param session
     */
    public void editaCliente(HttpServletRequest request, HttpServletResponse response, HttpSession session) {

        ClientesPrincipalDTO clientesPrincipal = new ClientesPrincipalDTO();
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/ClientesJSP/editorCliente.jsp");
        int idCliente = Integer.parseInt(request.getParameter("idCliente"));

        ClientesDAO clientesDAO = new ClientesDAO();
        ClientesDTO clienteDTO = new ClientesDTO();

        clienteDTO = clientesDAO.clientesDTO(idCliente);
        clientesPrincipal.setClienteDTO(clienteDTO);

        clientesPrincipal.setFormularioDireccionApuntador("./Clientes?action=clienteRequest&flag=1&idReg=" + idCliente);
        session.setAttribute("clientesPrincipal", clientesPrincipal);

        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO QUE RECUPERA DATOS DEL FORMULARIO DE EDICION DEL
     * CLIENTE
     *
     * @param request
     * @param response
     * @param session
     */
    public void clienteRequest(HttpServletRequest request, HttpServletResponse response, HttpSession session) {


        ClientesPrincipalDTO clientesPrincipal = new ClientesPrincipalDTO();
        ClientesDTO clientesDTO = new ClientesDTO();
        ClientesDAO clientesDAO = new ClientesDAO();
        int banderaForm = Integer.parseInt(request.getParameter("flag")); // DEFINE SI ACTUALIZACION O REGISTRO NUEVO
        int idRegisto = Integer.parseInt(request.getParameter("idReg"));
        Vector errores = new Vector();

// BLOQUE DE LAS VALIDACIONES 
        if (request.getParameter("nombreCliente").toString().length() > 0) {
            clientesDTO.setNombreCliente(request.getParameter("nombreCliente"));
        } else {
            errores.add("Error el nomble Cliente es obligatorio");
        }

        if (request.getParameter("ciudad").toString().length() > 0) {
            clientesDTO.setCiudad(request.getParameter("ciudad"));
        } else {
            errores.add("Error el ciudad es obligatorio");
        }

        if (request.getParameter("estado").toString().length() > 0) {
            clientesDTO.setEstado(request.getParameter("estado"));
        } else {
            errores.add("Error el estado es obligatorio");
        }

        if (request.getParameter("telefono").toString().length() > 0) {
            clientesDTO.setTelefono(request.getParameter("telefono"));
        } else {
            errores.add("Error el telefono es obligatorio");
        }

        if (request.getParameter("domicilio").toString().length() > 0) {
            clientesDTO.setDomicilio(request.getParameter("domicilio"));
        } else {
            errores.add("Error el domicilio es obligatorio");
        }

        if (request.getParameter("codigoPostal").toString().length() > 0) {
            clientesDTO.setCodigoPostal(request.getParameter("codigoPostal"));
        } else {
            errores.add("Error el codigoPostal es obligatorio");
        }

        if (request.getParameter("colonia").toString().length() > 0) {
            clientesDTO.setColonia(request.getParameter("colonia"));
        } else {
            errores.add("Error el domicilio es obligatorio");
        }

        if (request.getParameter("rfc").toString().length() > 0) {
            clientesDTO.setRfc(request.getParameter("rfc"));
        } else {
            errores.add("Error el rfc es obligatorio o puede ingresa <<no aplica>>");
        }

        if (request.getParameter("descuentoAsignadoUno").toString().length() > 0) {
            clientesDTO.setDescuentoAsignadoUno(Double.parseDouble(request.getParameter("descuentoAsignadoUno")));
        } else {
            errores.add("Error el descuentoAsignadoUno es obligatorio");
        }

        if (request.getParameter("descuentoAsignadoDos").toString().length() > 0) {
            clientesDTO.setDescuentoAsignadoDos(Double.parseDouble(request.getParameter("descuentoAsignadoDos")));
        } else {
            errores.add("Error el descuentoAsignadoDos es obligatorio");
        }

        if (request.getParameter("descuentoAsignadoTres").toString().length() > 0) {
            clientesDTO.setDescuentoAsignadoTres(Double.parseDouble(request.getParameter("descuentoAsignadoTres")));
        } else {
            errores.add("Error el descuentoAsignadoTres es obligatorio");
        }
// BLOQUE DE VALIDACIONES FIN

        // nuevo registro
        if (banderaForm == 0 && idRegisto == 0) {

            if (errores.size() == 0) {
                clientesDAO.nuevoCliente(clientesDTO);

                RequestDispatcher d = request.getRequestDispatcher("./Clientes?action=clientesAdmin");
                try {
                    d.forward(request, response);
                } catch (ServletException ex) {
                    Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
                }

            } else if (errores.size() > 0) {
                clientesPrincipal.setErrores(errores);
                clientesPrincipal.setnErrores(errores.size());
                session.setAttribute("clientesPrincipal", clientesPrincipal);
                RequestDispatcher d = request.getRequestDispatcher("TarryJSP/ClientesJSP/editorCliente.jsp");
                try {
                    d.forward(request, response);
                } catch (ServletException ex) {
                    Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } else if (banderaForm == 1 && idRegisto > 0) {
            if (errores.size() == 0) {
                clientesDTO.setId(idRegisto);
                clientesDAO.editaCliente(clientesDTO);

                RequestDispatcher d = request.getRequestDispatcher("./Clientes?action=clientesAdmin");
                try {
                    d.forward(request, response);
                } catch (ServletException ex) {
                    Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
                }

            } else if (errores.size() > 0) {
                clientesPrincipal.setErrores(errores);
                clientesPrincipal.setnErrores(errores.size());
                session.setAttribute("clientesPrincipal", clientesPrincipal);
                RequestDispatcher d = request.getRequestDispatcher("TarryJSP/ClientesJSP/editorCliente.jsp");
                try {
                    d.forward(request, response);
                } catch (ServletException ex) {
                    Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/ClientesJSP/editorCliente.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * ALAN GONZALEZ SERVICIO PARA FILTRAR CLIENTES EN EL ADMINISTRADOR
     *
     * @param request
     * @param response
     * @param session
     */
    public void nombreClienteFiltro(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        String nombreClienteFiltrado = request.getParameter("nombreClienteFiltro");
        ClientesPrincipalDTO clientesPrincipal = new ClientesPrincipalDTO();
        ClientesDAO clientesDAO = new ClientesDAO();
        Vector vClientes = new Vector();
        
        vClientes = clientesDAO.todosClientesNombre(nombreClienteFiltrado);
        clientesPrincipal.setClientes(vClientes);
        
        session.setAttribute("clientesPrincipal", clientesPrincipal);
        RequestDispatcher d = request.getRequestDispatcher("TarryJSP/ClientesJSP/ClientesAdmin.jsp");
        try {
            d.forward(request, response);
        } catch (ServletException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Clientes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
